from fastapi import APIRouter, Query, Request, Form
from app.services.prompt_service import PromptService

# prefix 为dify中的应用名，tags 为应用下的分类
router = APIRouter(prefix="/task/prompts", tags=["prompts"])

# 全局统一响应格式
def make_response(result=None, error=0, message="请求成功"):
    """
    统一返回格式
    :param result: 返回的数据内容
    :param error: 错误码，0 表示无错误
    :param message: 提示信息
    :return: JSON 格式响应
    """
    return {
        "error": error,
        "result": result,
        "message": message
    }

@router.get("/list")
def get_prompt_list(
        request: Request,
        version: str = Query(..., alias="version", description="API 版本号"),
        type: str = Query(..., alias="type", description="prompt 类型")
):
    """
    获取可用的 prompt 列表，支持版本参数
    """
    try:
        # 从请求url 中获取第1个路径
        app = request.url.path.split("/")[1]
        prompt_service = PromptService(app, version)
        prompt_list = prompt_service.get_prompt_list(type)
        return make_response(prompt_list)
    except Exception as e:
        return {"error": str(e)}

@router.post("/info")
async def get_prompt_info(
        request: Request,
        version: str = Form(..., description="API 版本号"),
        type: str = Form(..., description="prompt 类型"),
        name: str = Form(..., description="prompt 名称")
):
    """
    获取指定 prompt 信息，支持版本参数
    """
    try:
        # 1. 获取所有表单数据（包括固定字段和动态字段）
        form_data = await request.form()
        all_form_fields = dict(form_data)

        # 2. 提取固定字段（已通过 FastAPI 自动验证）
        fixed_fields = {
            "version": version,
            "type": type,
            "name": name
        }

        # 3. 动态字段 = 所有字段 - 固定字段
        dynamic_fields = {
            k: v for k, v in all_form_fields.items() 
            if k not in fixed_fields
        }

        # 4. 合并到上下文（或直接使用 dynamic_fields）
        context = dynamic_fields
        
        # 从请求url 中获取第1个路径
        app = request.url.path.split("/")[1]
        prompt_service = PromptService(app, version)
        prompt_info = prompt_service.get_prompt(type, name, **context)
        return make_response(prompt_info)
    except Exception as e:
        return {"error": str(e)}